/*
 * (C) Copyright 2005- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 *
 * In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
 * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
 */

#include <assert.h>
#include "grib_api_internal.h"

int assertion_caught = 0;

typedef enum
{
    IBM_FLOAT,
    IEEE_FLOAT
} FloatRep;

static void compare_doubles(const double d1, const double d2, const double epsilon)
{
    assert(fabs(d1 - d2) < epsilon);
}

static void check_float_representation(const double val, const double expected, const FloatRep rep)
{
    double out             = 0;
    const double tolerance = 1e-9;
    if (rep == IBM_FLOAT)
        assert(grib_nearest_smaller_ibm_float(val, &out) == GRIB_SUCCESS);
    else
        assert(grib_nearest_smaller_ieee_float(val, &out) == GRIB_SUCCESS);

    /*printf("%s: d1=%10.20f, out=%10.20f\n", (rep==IBM_FLOAT)?"ibm":"ieee", val, out);*/

    compare_doubles(out, expected, tolerance);
}

static void test_get_git_sha1()
{
    const char* sha1 = grib_get_git_sha1();
    Assert(sha1 != NULL);
    printf("Testing: test_get_git_sha1... %s\n", sha1);
}

static void test_grib_nearest_smaller_ibmfloat()
{
    printf("Testing: test_grib_nearest_smaller_ibmfloat...\n");
    check_float_representation(-1.0, -1.0, IBM_FLOAT);
    check_float_representation(0.0, 0.0, IBM_FLOAT);
    check_float_representation(1.0, 1.0, IBM_FLOAT);
    check_float_representation(1.1, 1.0999994277954, IBM_FLOAT);
    check_float_representation(10.6, 10.599999427795, IBM_FLOAT);
    check_float_representation(7.85, 7.8499994277954, IBM_FLOAT);
}

static void test_grib_nearest_smaller_ieeefloat()
{
    printf("Testing: test_grib_nearest_smaller_ieeefloat...\n");
    check_float_representation(-1.0, -1.0, IEEE_FLOAT);
    check_float_representation(0.0, 0.0, IEEE_FLOAT);
    check_float_representation(1.0, 1.0, IEEE_FLOAT);
    check_float_representation(1.1, 1.0999999046325, IEEE_FLOAT);
    check_float_representation(10.6, 10.599999427795, IEEE_FLOAT);
    check_float_representation(7.85, 7.8499999046325, IEEE_FLOAT);
}

static void test_gaussian_latitudes(int order)
{
    int ret       = 0;
    const int num = 2 * order;
    double lat1 = 0, lat2 = 0;
    double* lats = (double*)malloc(sizeof(double) * num);
    printf("Testing: test_gaussian_latitudes order=%d...\n", order);
    ret = grib_get_gaussian_latitudes(order, lats);
    Assert(ret == GRIB_SUCCESS);

    lat1 = lats[0];
    lat2 = lats[num - 1];
    /* Check first and last latitudes are the same with opposite sign */
    compare_doubles(lat1, -lat2, 1.0e-6);

    free(lats);
}

static void test_gaussian_latitude_640()
{
    /* Test all latitudes for one specific Gaussian number */
    const int order        = 640;
    const int num          = 2 * order;
    int ret                = 0;
    const double tolerance = 1e-6;
    double* lats           = (double*)malloc(sizeof(double) * num);
    ret                    = grib_get_gaussian_latitudes(order, lats);
    Assert(ret == GRIB_SUCCESS);
    printf("Testing: test_gaussian_latitude_640...\n");

    compare_doubles(lats[0], 89.892396, tolerance);
    compare_doubles(lats[1], 89.753005, tolerance);
    compare_doubles(lats[2], 89.612790, tolerance);
    compare_doubles(lats[3], 89.472390, tolerance);
    compare_doubles(lats[4], 89.331918, tolerance);
    compare_doubles(lats[5], 89.191413, tolerance);
    compare_doubles(lats[6], 89.050889, tolerance);
    compare_doubles(lats[7], 88.910352, tolerance);
    compare_doubles(lats[8], 88.769808, tolerance);
    compare_doubles(lats[9], 88.629259, tolerance);
    compare_doubles(lats[10], 88.488706, tolerance);
    compare_doubles(lats[11], 88.348150, tolerance);
    compare_doubles(lats[12], 88.207592, tolerance);
    compare_doubles(lats[13], 88.067032, tolerance);
    compare_doubles(lats[14], 87.926471, tolerance);
    compare_doubles(lats[15], 87.785908, tolerance);
    compare_doubles(lats[16], 87.645345, tolerance);
    compare_doubles(lats[17], 87.504781, tolerance);
    compare_doubles(lats[18], 87.364216, tolerance);
    compare_doubles(lats[19], 87.223651, tolerance);
    compare_doubles(lats[20], 87.083085, tolerance);
    compare_doubles(lats[21], 86.942519, tolerance);
    compare_doubles(lats[22], 86.801952, tolerance);
    compare_doubles(lats[23], 86.661385, tolerance);
    compare_doubles(lats[24], 86.520818, tolerance);
    compare_doubles(lats[25], 86.380251, tolerance);
    compare_doubles(lats[26], 86.239684, tolerance);
    compare_doubles(lats[27], 86.099116, tolerance);
    compare_doubles(lats[28], 85.958548, tolerance);
    compare_doubles(lats[29], 85.817980, tolerance);
    compare_doubles(lats[30], 85.677412, tolerance);
    compare_doubles(lats[31], 85.536844, tolerance);
    compare_doubles(lats[32], 85.396275, tolerance);
    compare_doubles(lats[33], 85.255707, tolerance);
    compare_doubles(lats[34], 85.115138, tolerance);
    compare_doubles(lats[35], 84.974570, tolerance);
    compare_doubles(lats[36], 84.834001, tolerance);
    compare_doubles(lats[37], 84.693432, tolerance);
    compare_doubles(lats[38], 84.552863, tolerance);
    compare_doubles(lats[39], 84.412294, tolerance);
    compare_doubles(lats[40], 84.271725, tolerance);
    compare_doubles(lats[41], 84.131156, tolerance);
    compare_doubles(lats[42], 83.990587, tolerance);
    compare_doubles(lats[43], 83.850018, tolerance);
    compare_doubles(lats[44], 83.709449, tolerance);
    compare_doubles(lats[45], 83.568880, tolerance);
    compare_doubles(lats[46], 83.428310, tolerance);
    compare_doubles(lats[47], 83.287741, tolerance);
    compare_doubles(lats[48], 83.147172, tolerance);
    compare_doubles(lats[49], 83.006602, tolerance);
    compare_doubles(lats[50], 82.866033, tolerance);
    compare_doubles(lats[51], 82.725464, tolerance);
    compare_doubles(lats[52], 82.584894, tolerance);
    compare_doubles(lats[53], 82.444325, tolerance);
    compare_doubles(lats[54], 82.303755, tolerance);
    compare_doubles(lats[55], 82.163186, tolerance);
    compare_doubles(lats[56], 82.022616, tolerance);
    compare_doubles(lats[57], 81.882047, tolerance);
    compare_doubles(lats[58], 81.741477, tolerance);
    compare_doubles(lats[59], 81.600908, tolerance);
    compare_doubles(lats[60], 81.460338, tolerance);
    compare_doubles(lats[61], 81.319768, tolerance);
    compare_doubles(lats[62], 81.179199, tolerance);
    compare_doubles(lats[63], 81.038629, tolerance);
    compare_doubles(lats[64], 80.898059, tolerance);
    compare_doubles(lats[65], 80.757490, tolerance);
    compare_doubles(lats[66], 80.616920, tolerance);
    compare_doubles(lats[67], 80.476350, tolerance);
    compare_doubles(lats[68], 80.335781, tolerance);
    compare_doubles(lats[69], 80.195211, tolerance);
    compare_doubles(lats[70], 80.054641, tolerance);
    compare_doubles(lats[71], 79.914072, tolerance);
    compare_doubles(lats[72], 79.773502, tolerance);
    compare_doubles(lats[73], 79.632932, tolerance);
    compare_doubles(lats[74], 79.492362, tolerance);
    compare_doubles(lats[75], 79.351792, tolerance);
    compare_doubles(lats[76], 79.211223, tolerance);
    compare_doubles(lats[77], 79.070653, tolerance);
    compare_doubles(lats[78], 78.930083, tolerance);
    compare_doubles(lats[79], 78.789513, tolerance);
    compare_doubles(lats[80], 78.648943, tolerance);
    compare_doubles(lats[81], 78.508374, tolerance);
    compare_doubles(lats[82], 78.367804, tolerance);
    compare_doubles(lats[83], 78.227234, tolerance);
    compare_doubles(lats[84], 78.086664, tolerance);
    compare_doubles(lats[85], 77.946094, tolerance);
    compare_doubles(lats[86], 77.805524, tolerance);
    compare_doubles(lats[87], 77.664955, tolerance);
    compare_doubles(lats[88], 77.524385, tolerance);
    compare_doubles(lats[89], 77.383815, tolerance);
    compare_doubles(lats[90], 77.243245, tolerance);
    compare_doubles(lats[91], 77.102675, tolerance);
    compare_doubles(lats[92], 76.962105, tolerance);
    compare_doubles(lats[93], 76.821535, tolerance);
    compare_doubles(lats[94], 76.680966, tolerance);
    compare_doubles(lats[95], 76.540396, tolerance);
    compare_doubles(lats[96], 76.399826, tolerance);
    compare_doubles(lats[97], 76.259256, tolerance);
    compare_doubles(lats[98], 76.118686, tolerance);
    compare_doubles(lats[99], 75.978116, tolerance);
    compare_doubles(lats[100], 75.837546, tolerance);
    compare_doubles(lats[101], 75.696976, tolerance);
    compare_doubles(lats[102], 75.556406, tolerance);
    compare_doubles(lats[103], 75.415836, tolerance);
    compare_doubles(lats[104], 75.275266, tolerance);
    compare_doubles(lats[105], 75.134697, tolerance);
    compare_doubles(lats[106], 74.994127, tolerance);
    compare_doubles(lats[107], 74.853557, tolerance);
    compare_doubles(lats[108], 74.712987, tolerance);
    compare_doubles(lats[109], 74.572417, tolerance);
    compare_doubles(lats[110], 74.431847, tolerance);
    compare_doubles(lats[111], 74.291277, tolerance);
    compare_doubles(lats[112], 74.150707, tolerance);
    compare_doubles(lats[113], 74.010137, tolerance);
    compare_doubles(lats[114], 73.869567, tolerance);
    compare_doubles(lats[115], 73.728997, tolerance);
    compare_doubles(lats[116], 73.588427, tolerance);
    compare_doubles(lats[117], 73.447857, tolerance);
    compare_doubles(lats[118], 73.307287, tolerance);
    compare_doubles(lats[119], 73.166717, tolerance);
    compare_doubles(lats[120], 73.026147, tolerance);
    compare_doubles(lats[121], 72.885577, tolerance);
    compare_doubles(lats[122], 72.745007, tolerance);
    compare_doubles(lats[123], 72.604437, tolerance);
    compare_doubles(lats[124], 72.463867, tolerance);
    compare_doubles(lats[125], 72.323298, tolerance);
    compare_doubles(lats[126], 72.182728, tolerance);
    compare_doubles(lats[127], 72.042158, tolerance);
    compare_doubles(lats[128], 71.901588, tolerance);
    compare_doubles(lats[129], 71.761018, tolerance);
    compare_doubles(lats[130], 71.620448, tolerance);
    compare_doubles(lats[131], 71.479878, tolerance);
    compare_doubles(lats[132], 71.339308, tolerance);
    compare_doubles(lats[133], 71.198738, tolerance);
    compare_doubles(lats[134], 71.058168, tolerance);
    compare_doubles(lats[135], 70.917598, tolerance);
    compare_doubles(lats[136], 70.777028, tolerance);
    compare_doubles(lats[137], 70.636458, tolerance);
    compare_doubles(lats[138], 70.495888, tolerance);
    compare_doubles(lats[139], 70.355318, tolerance);
    compare_doubles(lats[140], 70.214748, tolerance);
    compare_doubles(lats[141], 70.074178, tolerance);
    compare_doubles(lats[142], 69.933608, tolerance);
    compare_doubles(lats[143], 69.793038, tolerance);
    compare_doubles(lats[144], 69.652468, tolerance);
    compare_doubles(lats[145], 69.511898, tolerance);
    compare_doubles(lats[146], 69.371328, tolerance);
    compare_doubles(lats[147], 69.230758, tolerance);
    compare_doubles(lats[148], 69.090188, tolerance);
    compare_doubles(lats[149], 68.949618, tolerance);
    compare_doubles(lats[150], 68.809048, tolerance);
    compare_doubles(lats[151], 68.668478, tolerance);
    compare_doubles(lats[152], 68.527908, tolerance);
    compare_doubles(lats[153], 68.387338, tolerance);
    compare_doubles(lats[154], 68.246768, tolerance);
    compare_doubles(lats[155], 68.106198, tolerance);
    compare_doubles(lats[156], 67.965628, tolerance);
    compare_doubles(lats[157], 67.825058, tolerance);
    compare_doubles(lats[158], 67.684488, tolerance);
    compare_doubles(lats[159], 67.543918, tolerance);
    compare_doubles(lats[160], 67.403348, tolerance);
    compare_doubles(lats[161], 67.262778, tolerance);
    compare_doubles(lats[162], 67.122208, tolerance);
    compare_doubles(lats[163], 66.981638, tolerance);
    compare_doubles(lats[164], 66.841067, tolerance);
    compare_doubles(lats[165], 66.700497, tolerance);
    compare_doubles(lats[166], 66.559927, tolerance);
    compare_doubles(lats[167], 66.419357, tolerance);
    compare_doubles(lats[168], 66.278787, tolerance);
    compare_doubles(lats[169], 66.138217, tolerance);
    compare_doubles(lats[170], 65.997647, tolerance);
    compare_doubles(lats[171], 65.857077, tolerance);
    compare_doubles(lats[172], 65.716507, tolerance);
    compare_doubles(lats[173], 65.575937, tolerance);
    compare_doubles(lats[174], 65.435367, tolerance);
    compare_doubles(lats[175], 65.294797, tolerance);
    compare_doubles(lats[176], 65.154227, tolerance);
    compare_doubles(lats[177], 65.013657, tolerance);
    compare_doubles(lats[178], 64.873087, tolerance);
    compare_doubles(lats[179], 64.732517, tolerance);
    compare_doubles(lats[180], 64.591947, tolerance);
    compare_doubles(lats[181], 64.451377, tolerance);
    compare_doubles(lats[182], 64.310807, tolerance);
    compare_doubles(lats[183], 64.170237, tolerance);
    compare_doubles(lats[184], 64.029667, tolerance);
    compare_doubles(lats[185], 63.889097, tolerance);
    compare_doubles(lats[186], 63.748527, tolerance);
    compare_doubles(lats[187], 63.607957, tolerance);
    compare_doubles(lats[188], 63.467387, tolerance);
    compare_doubles(lats[189], 63.326817, tolerance);
    compare_doubles(lats[190], 63.186247, tolerance);
    compare_doubles(lats[191], 63.045677, tolerance);
    compare_doubles(lats[192], 62.905107, tolerance);
    compare_doubles(lats[193], 62.764537, tolerance);
    compare_doubles(lats[194], 62.623967, tolerance);
    compare_doubles(lats[195], 62.483397, tolerance);
    compare_doubles(lats[196], 62.342826, tolerance);
    compare_doubles(lats[197], 62.202256, tolerance);
    compare_doubles(lats[198], 62.061686, tolerance);
    compare_doubles(lats[199], 61.921116, tolerance);
    compare_doubles(lats[200], 61.780546, tolerance);
    compare_doubles(lats[201], 61.639976, tolerance);
    compare_doubles(lats[202], 61.499406, tolerance);
    compare_doubles(lats[203], 61.358836, tolerance);
    compare_doubles(lats[204], 61.218266, tolerance);
    compare_doubles(lats[205], 61.077696, tolerance);
    compare_doubles(lats[206], 60.937126, tolerance);
    compare_doubles(lats[207], 60.796556, tolerance);
    compare_doubles(lats[208], 60.655986, tolerance);
    compare_doubles(lats[209], 60.515416, tolerance);
    compare_doubles(lats[210], 60.374846, tolerance);
    compare_doubles(lats[211], 60.234276, tolerance);
    compare_doubles(lats[212], 60.093706, tolerance);
    compare_doubles(lats[213], 59.953136, tolerance);
    compare_doubles(lats[214], 59.812566, tolerance);
    compare_doubles(lats[215], 59.671996, tolerance);
    compare_doubles(lats[216], 59.531426, tolerance);
    compare_doubles(lats[217], 59.390856, tolerance);
    compare_doubles(lats[218], 59.250286, tolerance);
    compare_doubles(lats[219], 59.109715, tolerance);
    compare_doubles(lats[220], 58.969145, tolerance);
    compare_doubles(lats[221], 58.828575, tolerance);
    compare_doubles(lats[222], 58.688005, tolerance);
    compare_doubles(lats[223], 58.547435, tolerance);
    compare_doubles(lats[224], 58.406865, tolerance);
    compare_doubles(lats[225], 58.266295, tolerance);
    compare_doubles(lats[226], 58.125725, tolerance);
    compare_doubles(lats[227], 57.985155, tolerance);
    compare_doubles(lats[228], 57.844585, tolerance);
    compare_doubles(lats[229], 57.704015, tolerance);
    compare_doubles(lats[230], 57.563445, tolerance);
    compare_doubles(lats[231], 57.422875, tolerance);
    compare_doubles(lats[232], 57.282305, tolerance);
    compare_doubles(lats[233], 57.141735, tolerance);
    compare_doubles(lats[234], 57.001165, tolerance);
    compare_doubles(lats[235], 56.860595, tolerance);
    compare_doubles(lats[236], 56.720025, tolerance);
    compare_doubles(lats[237], 56.579455, tolerance);
    compare_doubles(lats[238], 56.438884, tolerance);
    compare_doubles(lats[239], 56.298314, tolerance);
    compare_doubles(lats[240], 56.157744, tolerance);
    compare_doubles(lats[241], 56.017174, tolerance);
    compare_doubles(lats[242], 55.876604, tolerance);
    compare_doubles(lats[243], 55.736034, tolerance);
    compare_doubles(lats[244], 55.595464, tolerance);
    compare_doubles(lats[245], 55.454894, tolerance);
    compare_doubles(lats[246], 55.314324, tolerance);
    compare_doubles(lats[247], 55.173754, tolerance);
    compare_doubles(lats[248], 55.033184, tolerance);
    compare_doubles(lats[249], 54.892614, tolerance);
    compare_doubles(lats[250], 54.752044, tolerance);
    compare_doubles(lats[251], 54.611474, tolerance);
    compare_doubles(lats[252], 54.470904, tolerance);
    compare_doubles(lats[253], 54.330334, tolerance);
    compare_doubles(lats[254], 54.189764, tolerance);
    compare_doubles(lats[255], 54.049194, tolerance);
    compare_doubles(lats[256], 53.908623, tolerance);
    compare_doubles(lats[257], 53.768053, tolerance);
    compare_doubles(lats[258], 53.627483, tolerance);
    compare_doubles(lats[259], 53.486913, tolerance);
    compare_doubles(lats[260], 53.346343, tolerance);
    compare_doubles(lats[261], 53.205773, tolerance);
    compare_doubles(lats[262], 53.065203, tolerance);
    compare_doubles(lats[263], 52.924633, tolerance);
    compare_doubles(lats[264], 52.784063, tolerance);
    compare_doubles(lats[265], 52.643493, tolerance);
    compare_doubles(lats[266], 52.502923, tolerance);
    compare_doubles(lats[267], 52.362353, tolerance);
    compare_doubles(lats[268], 52.221783, tolerance);
    compare_doubles(lats[269], 52.081213, tolerance);
    compare_doubles(lats[270], 51.940643, tolerance);
    compare_doubles(lats[271], 51.800073, tolerance);
    compare_doubles(lats[272], 51.659502, tolerance);
    compare_doubles(lats[273], 51.518932, tolerance);
    compare_doubles(lats[274], 51.378362, tolerance);
    compare_doubles(lats[275], 51.237792, tolerance);
    compare_doubles(lats[276], 51.097222, tolerance);
    compare_doubles(lats[277], 50.956652, tolerance);
    compare_doubles(lats[278], 50.816082, tolerance);
    compare_doubles(lats[279], 50.675512, tolerance);
    compare_doubles(lats[280], 50.534942, tolerance);
    compare_doubles(lats[281], 50.394372, tolerance);
    compare_doubles(lats[282], 50.253802, tolerance);
    compare_doubles(lats[283], 50.113232, tolerance);
    compare_doubles(lats[284], 49.972662, tolerance);
    compare_doubles(lats[285], 49.832092, tolerance);
    compare_doubles(lats[286], 49.691522, tolerance);
    compare_doubles(lats[287], 49.550952, tolerance);
    compare_doubles(lats[288], 49.410381, tolerance);
    compare_doubles(lats[289], 49.269811, tolerance);
    compare_doubles(lats[290], 49.129241, tolerance);
    compare_doubles(lats[291], 48.988671, tolerance);
    compare_doubles(lats[292], 48.848101, tolerance);
    compare_doubles(lats[293], 48.707531, tolerance);
    compare_doubles(lats[294], 48.566961, tolerance);
    compare_doubles(lats[295], 48.426391, tolerance);
    compare_doubles(lats[296], 48.285821, tolerance);
    compare_doubles(lats[297], 48.145251, tolerance);
    compare_doubles(lats[298], 48.004681, tolerance);
    compare_doubles(lats[299], 47.864111, tolerance);
    compare_doubles(lats[300], 47.723541, tolerance);
    compare_doubles(lats[301], 47.582971, tolerance);
    compare_doubles(lats[302], 47.442401, tolerance);
    compare_doubles(lats[303], 47.301830, tolerance);
    compare_doubles(lats[304], 47.161260, tolerance);
    compare_doubles(lats[305], 47.020690, tolerance);
    compare_doubles(lats[306], 46.880120, tolerance);
    compare_doubles(lats[307], 46.739550, tolerance);
    compare_doubles(lats[308], 46.598980, tolerance);
    compare_doubles(lats[309], 46.458410, tolerance);
    compare_doubles(lats[310], 46.317840, tolerance);
    compare_doubles(lats[311], 46.177270, tolerance);
    compare_doubles(lats[312], 46.036700, tolerance);
    compare_doubles(lats[313], 45.896130, tolerance);
    compare_doubles(lats[314], 45.755560, tolerance);
    compare_doubles(lats[315], 45.614990, tolerance);
    compare_doubles(lats[316], 45.474420, tolerance);
    compare_doubles(lats[317], 45.333850, tolerance);
    compare_doubles(lats[318], 45.193279, tolerance);
    compare_doubles(lats[319], 45.052709, tolerance);
    compare_doubles(lats[320], 44.912139, tolerance);
    compare_doubles(lats[321], 44.771569, tolerance);
    compare_doubles(lats[322], 44.630999, tolerance);
    compare_doubles(lats[323], 44.490429, tolerance);
    compare_doubles(lats[324], 44.349859, tolerance);
    compare_doubles(lats[325], 44.209289, tolerance);
    compare_doubles(lats[326], 44.068719, tolerance);
    compare_doubles(lats[327], 43.928149, tolerance);
    compare_doubles(lats[328], 43.787579, tolerance);
    compare_doubles(lats[329], 43.647009, tolerance);
    compare_doubles(lats[330], 43.506439, tolerance);
    compare_doubles(lats[331], 43.365869, tolerance);
    compare_doubles(lats[332], 43.225299, tolerance);
    compare_doubles(lats[333], 43.084728, tolerance);
    compare_doubles(lats[334], 42.944158, tolerance);
    compare_doubles(lats[335], 42.803588, tolerance);
    compare_doubles(lats[336], 42.663018, tolerance);
    compare_doubles(lats[337], 42.522448, tolerance);
    compare_doubles(lats[338], 42.381878, tolerance);
    compare_doubles(lats[339], 42.241308, tolerance);
    compare_doubles(lats[340], 42.100738, tolerance);
    compare_doubles(lats[341], 41.960168, tolerance);
    compare_doubles(lats[342], 41.819598, tolerance);
    compare_doubles(lats[343], 41.679028, tolerance);
    compare_doubles(lats[344], 41.538458, tolerance);
    compare_doubles(lats[345], 41.397888, tolerance);
    compare_doubles(lats[346], 41.257318, tolerance);
    compare_doubles(lats[347], 41.116747, tolerance);
    compare_doubles(lats[348], 40.976177, tolerance);
    compare_doubles(lats[349], 40.835607, tolerance);
    compare_doubles(lats[350], 40.695037, tolerance);
    compare_doubles(lats[351], 40.554467, tolerance);
    compare_doubles(lats[352], 40.413897, tolerance);
    compare_doubles(lats[353], 40.273327, tolerance);
    compare_doubles(lats[354], 40.132757, tolerance);
    compare_doubles(lats[355], 39.992187, tolerance);
    compare_doubles(lats[356], 39.851617, tolerance);
    compare_doubles(lats[357], 39.711047, tolerance);
    compare_doubles(lats[358], 39.570477, tolerance);
    compare_doubles(lats[359], 39.429907, tolerance);
    compare_doubles(lats[360], 39.289337, tolerance);
    compare_doubles(lats[361], 39.148766, tolerance);
    compare_doubles(lats[362], 39.008196, tolerance);
    compare_doubles(lats[363], 38.867626, tolerance);
    compare_doubles(lats[364], 38.727056, tolerance);
    compare_doubles(lats[365], 38.586486, tolerance);
    compare_doubles(lats[366], 38.445916, tolerance);
    compare_doubles(lats[367], 38.305346, tolerance);
    compare_doubles(lats[368], 38.164776, tolerance);
    compare_doubles(lats[369], 38.024206, tolerance);
    compare_doubles(lats[370], 37.883636, tolerance);
    compare_doubles(lats[371], 37.743066, tolerance);
    compare_doubles(lats[372], 37.602496, tolerance);
    compare_doubles(lats[373], 37.461926, tolerance);
    compare_doubles(lats[374], 37.321356, tolerance);
    compare_doubles(lats[375], 37.180785, tolerance);
    compare_doubles(lats[376], 37.040215, tolerance);
    compare_doubles(lats[377], 36.899645, tolerance);
    compare_doubles(lats[378], 36.759075, tolerance);
    compare_doubles(lats[379], 36.618505, tolerance);
    compare_doubles(lats[380], 36.477935, tolerance);
    compare_doubles(lats[381], 36.337365, tolerance);
    compare_doubles(lats[382], 36.196795, tolerance);
    compare_doubles(lats[383], 36.056225, tolerance);
    compare_doubles(lats[384], 35.915655, tolerance);
    compare_doubles(lats[385], 35.775085, tolerance);
    compare_doubles(lats[386], 35.634515, tolerance);
    compare_doubles(lats[387], 35.493945, tolerance);
    compare_doubles(lats[388], 35.353374, tolerance);
    compare_doubles(lats[389], 35.212804, tolerance);
    compare_doubles(lats[390], 35.072234, tolerance);
    compare_doubles(lats[391], 34.931664, tolerance);
    compare_doubles(lats[392], 34.791094, tolerance);
    compare_doubles(lats[393], 34.650524, tolerance);
    compare_doubles(lats[394], 34.509954, tolerance);
    compare_doubles(lats[395], 34.369384, tolerance);
    compare_doubles(lats[396], 34.228814, tolerance);
    compare_doubles(lats[397], 34.088244, tolerance);
    compare_doubles(lats[398], 33.947674, tolerance);
    compare_doubles(lats[399], 33.807104, tolerance);
    compare_doubles(lats[400], 33.666534, tolerance);
    compare_doubles(lats[401], 33.525964, tolerance);
    compare_doubles(lats[402], 33.385393, tolerance);
    compare_doubles(lats[403], 33.244823, tolerance);
    compare_doubles(lats[404], 33.104253, tolerance);
    compare_doubles(lats[405], 32.963683, tolerance);
    compare_doubles(lats[406], 32.823113, tolerance);
    compare_doubles(lats[407], 32.682543, tolerance);
    compare_doubles(lats[408], 32.541973, tolerance);
    compare_doubles(lats[409], 32.401403, tolerance);
    compare_doubles(lats[410], 32.260833, tolerance);
    compare_doubles(lats[411], 32.120263, tolerance);
    compare_doubles(lats[412], 31.979693, tolerance);
    compare_doubles(lats[413], 31.839123, tolerance);
    compare_doubles(lats[414], 31.698553, tolerance);
    compare_doubles(lats[415], 31.557982, tolerance);
    compare_doubles(lats[416], 31.417412, tolerance);
    compare_doubles(lats[417], 31.276842, tolerance);
    compare_doubles(lats[418], 31.136272, tolerance);
    compare_doubles(lats[419], 30.995702, tolerance);
    compare_doubles(lats[420], 30.855132, tolerance);
    compare_doubles(lats[421], 30.714562, tolerance);
    compare_doubles(lats[422], 30.573992, tolerance);
    compare_doubles(lats[423], 30.433422, tolerance);
    compare_doubles(lats[424], 30.292852, tolerance);
    compare_doubles(lats[425], 30.152282, tolerance);
    compare_doubles(lats[426], 30.011712, tolerance);
    compare_doubles(lats[427], 29.871142, tolerance);
    compare_doubles(lats[428], 29.730572, tolerance);
    compare_doubles(lats[429], 29.590001, tolerance);
    compare_doubles(lats[430], 29.449431, tolerance);
    compare_doubles(lats[431], 29.308861, tolerance);
    compare_doubles(lats[432], 29.168291, tolerance);
    compare_doubles(lats[433], 29.027721, tolerance);
    compare_doubles(lats[434], 28.887151, tolerance);
    compare_doubles(lats[435], 28.746581, tolerance);
    compare_doubles(lats[436], 28.606011, tolerance);
    compare_doubles(lats[437], 28.465441, tolerance);
    compare_doubles(lats[438], 28.324871, tolerance);
    compare_doubles(lats[439], 28.184301, tolerance);
    compare_doubles(lats[440], 28.043731, tolerance);
    compare_doubles(lats[441], 27.903161, tolerance);
    compare_doubles(lats[442], 27.762590, tolerance);
    compare_doubles(lats[443], 27.622020, tolerance);
    compare_doubles(lats[444], 27.481450, tolerance);
    compare_doubles(lats[445], 27.340880, tolerance);
    compare_doubles(lats[446], 27.200310, tolerance);
    compare_doubles(lats[447], 27.059740, tolerance);
    compare_doubles(lats[448], 26.919170, tolerance);
    compare_doubles(lats[449], 26.778600, tolerance);
    compare_doubles(lats[450], 26.638030, tolerance);
    compare_doubles(lats[451], 26.497460, tolerance);
    compare_doubles(lats[452], 26.356890, tolerance);
    compare_doubles(lats[453], 26.216320, tolerance);
    compare_doubles(lats[454], 26.075750, tolerance);
    compare_doubles(lats[455], 25.935179, tolerance);
    compare_doubles(lats[456], 25.794609, tolerance);
    compare_doubles(lats[457], 25.654039, tolerance);
    compare_doubles(lats[458], 25.513469, tolerance);
    compare_doubles(lats[459], 25.372899, tolerance);
    compare_doubles(lats[460], 25.232329, tolerance);
    compare_doubles(lats[461], 25.091759, tolerance);
    compare_doubles(lats[462], 24.951189, tolerance);
    compare_doubles(lats[463], 24.810619, tolerance);
    compare_doubles(lats[464], 24.670049, tolerance);
    compare_doubles(lats[465], 24.529479, tolerance);
    compare_doubles(lats[466], 24.388909, tolerance);
    compare_doubles(lats[467], 24.248339, tolerance);
    compare_doubles(lats[468], 24.107768, tolerance);
    compare_doubles(lats[469], 23.967198, tolerance);
    compare_doubles(lats[470], 23.826628, tolerance);
    compare_doubles(lats[471], 23.686058, tolerance);
    compare_doubles(lats[472], 23.545488, tolerance);
    compare_doubles(lats[473], 23.404918, tolerance);
    compare_doubles(lats[474], 23.264348, tolerance);
    compare_doubles(lats[475], 23.123778, tolerance);
    compare_doubles(lats[476], 22.983208, tolerance);
    compare_doubles(lats[477], 22.842638, tolerance);
    compare_doubles(lats[478], 22.702068, tolerance);
    compare_doubles(lats[479], 22.561498, tolerance);
    compare_doubles(lats[480], 22.420928, tolerance);
    compare_doubles(lats[481], 22.280357, tolerance);
    compare_doubles(lats[482], 22.139787, tolerance);
    compare_doubles(lats[483], 21.999217, tolerance);
    compare_doubles(lats[484], 21.858647, tolerance);
    compare_doubles(lats[485], 21.718077, tolerance);
    compare_doubles(lats[486], 21.577507, tolerance);
    compare_doubles(lats[487], 21.436937, tolerance);
    compare_doubles(lats[488], 21.296367, tolerance);
    compare_doubles(lats[489], 21.155797, tolerance);
    compare_doubles(lats[490], 21.015227, tolerance);
    compare_doubles(lats[491], 20.874657, tolerance);
    compare_doubles(lats[492], 20.734087, tolerance);
    compare_doubles(lats[493], 20.593517, tolerance);
    compare_doubles(lats[494], 20.452946, tolerance);
    compare_doubles(lats[495], 20.312376, tolerance);
    compare_doubles(lats[496], 20.171806, tolerance);
    compare_doubles(lats[497], 20.031236, tolerance);
    compare_doubles(lats[498], 19.890666, tolerance);
    compare_doubles(lats[499], 19.750096, tolerance);
    compare_doubles(lats[500], 19.609526, tolerance);
    compare_doubles(lats[501], 19.468956, tolerance);
    compare_doubles(lats[502], 19.328386, tolerance);
    compare_doubles(lats[503], 19.187816, tolerance);
    compare_doubles(lats[504], 19.047246, tolerance);
    compare_doubles(lats[505], 18.906676, tolerance);
    compare_doubles(lats[506], 18.766106, tolerance);
    compare_doubles(lats[507], 18.625535, tolerance);
    compare_doubles(lats[508], 18.484965, tolerance);
    compare_doubles(lats[509], 18.344395, tolerance);
    compare_doubles(lats[510], 18.203825, tolerance);
    compare_doubles(lats[511], 18.063255, tolerance);
    compare_doubles(lats[512], 17.922685, tolerance);
    compare_doubles(lats[513], 17.782115, tolerance);
    compare_doubles(lats[514], 17.641545, tolerance);
    compare_doubles(lats[515], 17.500975, tolerance);
    compare_doubles(lats[516], 17.360405, tolerance);
    compare_doubles(lats[517], 17.219835, tolerance);
    compare_doubles(lats[518], 17.079265, tolerance);
    compare_doubles(lats[519], 16.938694, tolerance);
    compare_doubles(lats[520], 16.798124, tolerance);
    compare_doubles(lats[521], 16.657554, tolerance);
    compare_doubles(lats[522], 16.516984, tolerance);
    compare_doubles(lats[523], 16.376414, tolerance);
    compare_doubles(lats[524], 16.235844, tolerance);
    compare_doubles(lats[525], 16.095274, tolerance);
    compare_doubles(lats[526], 15.954704, tolerance);
    compare_doubles(lats[527], 15.814134, tolerance);
    compare_doubles(lats[528], 15.673564, tolerance);
    compare_doubles(lats[529], 15.532994, tolerance);
    compare_doubles(lats[530], 15.392424, tolerance);
    compare_doubles(lats[531], 15.251854, tolerance);
    compare_doubles(lats[532], 15.111283, tolerance);
    compare_doubles(lats[533], 14.970713, tolerance);
    compare_doubles(lats[534], 14.830143, tolerance);
    compare_doubles(lats[535], 14.689573, tolerance);
    compare_doubles(lats[536], 14.549003, tolerance);
    compare_doubles(lats[537], 14.408433, tolerance);
    compare_doubles(lats[538], 14.267863, tolerance);
    compare_doubles(lats[539], 14.127293, tolerance);
    compare_doubles(lats[540], 13.986723, tolerance);
    compare_doubles(lats[541], 13.846153, tolerance);
    compare_doubles(lats[542], 13.705583, tolerance);
    compare_doubles(lats[543], 13.565013, tolerance);
    compare_doubles(lats[544], 13.424443, tolerance);
    compare_doubles(lats[545], 13.283872, tolerance);
    compare_doubles(lats[546], 13.143302, tolerance);
    compare_doubles(lats[547], 13.002732, tolerance);
    compare_doubles(lats[548], 12.862162, tolerance);
    compare_doubles(lats[549], 12.721592, tolerance);
    compare_doubles(lats[550], 12.581022, tolerance);
    compare_doubles(lats[551], 12.440452, tolerance);
    compare_doubles(lats[552], 12.299882, tolerance);
    compare_doubles(lats[553], 12.159312, tolerance);
    compare_doubles(lats[554], 12.018742, tolerance);
    compare_doubles(lats[555], 11.878172, tolerance);
    compare_doubles(lats[556], 11.737602, tolerance);
    compare_doubles(lats[557], 11.597032, tolerance);
    compare_doubles(lats[558], 11.456461, tolerance);
    compare_doubles(lats[559], 11.315891, tolerance);
    compare_doubles(lats[560], 11.175321, tolerance);
    compare_doubles(lats[561], 11.034751, tolerance);
    compare_doubles(lats[562], 10.894181, tolerance);
    compare_doubles(lats[563], 10.753611, tolerance);
    compare_doubles(lats[564], 10.613041, tolerance);
    compare_doubles(lats[565], 10.472471, tolerance);
    compare_doubles(lats[566], 10.331901, tolerance);
    compare_doubles(lats[567], 10.191331, tolerance);
    compare_doubles(lats[568], 10.050761, tolerance);
    compare_doubles(lats[569], 9.910191, tolerance);
    compare_doubles(lats[570], 9.769620, tolerance);
    compare_doubles(lats[571], 9.629050, tolerance);
    compare_doubles(lats[572], 9.488480, tolerance);
    compare_doubles(lats[573], 9.347910, tolerance);
    compare_doubles(lats[574], 9.207340, tolerance);
    compare_doubles(lats[575], 9.066770, tolerance);
    compare_doubles(lats[576], 8.926200, tolerance);
    compare_doubles(lats[577], 8.785630, tolerance);
    compare_doubles(lats[578], 8.645060, tolerance);
    compare_doubles(lats[579], 8.504490, tolerance);
    compare_doubles(lats[580], 8.363920, tolerance);
    compare_doubles(lats[581], 8.223350, tolerance);
    compare_doubles(lats[582], 8.082780, tolerance);
    compare_doubles(lats[583], 7.942209, tolerance);
    compare_doubles(lats[584], 7.801639, tolerance);
    compare_doubles(lats[585], 7.661069, tolerance);
    compare_doubles(lats[586], 7.520499, tolerance);
    compare_doubles(lats[587], 7.379929, tolerance);
    compare_doubles(lats[588], 7.239359, tolerance);
    compare_doubles(lats[589], 7.098789, tolerance);
    compare_doubles(lats[590], 6.958219, tolerance);
    compare_doubles(lats[591], 6.817649, tolerance);
    compare_doubles(lats[592], 6.677079, tolerance);
    compare_doubles(lats[593], 6.536509, tolerance);
    compare_doubles(lats[594], 6.395939, tolerance);
    compare_doubles(lats[595], 6.255369, tolerance);
    compare_doubles(lats[596], 6.114798, tolerance);
    compare_doubles(lats[597], 5.974228, tolerance);
    compare_doubles(lats[598], 5.833658, tolerance);
    compare_doubles(lats[599], 5.693088, tolerance);
    compare_doubles(lats[600], 5.552518, tolerance);
    compare_doubles(lats[601], 5.411948, tolerance);
    compare_doubles(lats[602], 5.271378, tolerance);
    compare_doubles(lats[603], 5.130808, tolerance);
    compare_doubles(lats[604], 4.990238, tolerance);
    compare_doubles(lats[605], 4.849668, tolerance);
    compare_doubles(lats[606], 4.709098, tolerance);
    compare_doubles(lats[607], 4.568528, tolerance);
    compare_doubles(lats[608], 4.427957, tolerance);
    compare_doubles(lats[609], 4.287387, tolerance);
    compare_doubles(lats[610], 4.146817, tolerance);
    compare_doubles(lats[611], 4.006247, tolerance);
    compare_doubles(lats[612], 3.865677, tolerance);
    compare_doubles(lats[613], 3.725107, tolerance);
    compare_doubles(lats[614], 3.584537, tolerance);
    compare_doubles(lats[615], 3.443967, tolerance);
    compare_doubles(lats[616], 3.303397, tolerance);
    compare_doubles(lats[617], 3.162827, tolerance);
    compare_doubles(lats[618], 3.022257, tolerance);
    compare_doubles(lats[619], 2.881687, tolerance);
    compare_doubles(lats[620], 2.741117, tolerance);
    compare_doubles(lats[621], 2.600546, tolerance);
    compare_doubles(lats[622], 2.459976, tolerance);
    compare_doubles(lats[623], 2.319406, tolerance);
    compare_doubles(lats[624], 2.178836, tolerance);
    compare_doubles(lats[625], 2.038266, tolerance);
    compare_doubles(lats[626], 1.897696, tolerance);
    compare_doubles(lats[627], 1.757126, tolerance);
    compare_doubles(lats[628], 1.616556, tolerance);
    compare_doubles(lats[629], 1.475986, tolerance);
    compare_doubles(lats[630], 1.335416, tolerance);
    compare_doubles(lats[631], 1.194846, tolerance);
    compare_doubles(lats[632], 1.054276, tolerance);
    compare_doubles(lats[633], 0.913706, tolerance);
    compare_doubles(lats[634], 0.773135, tolerance);
    compare_doubles(lats[635], 0.632565, tolerance);
    compare_doubles(lats[636], 0.491995, tolerance);
    compare_doubles(lats[637], 0.351425, tolerance);
    compare_doubles(lats[638], 0.210855, tolerance);
    compare_doubles(lats[639], 0.070285, tolerance);
    compare_doubles(lats[640], -0.070285, tolerance);
    compare_doubles(lats[641], -0.210855, tolerance);
    compare_doubles(lats[642], -0.351425, tolerance);
    compare_doubles(lats[643], -0.491995, tolerance);
    compare_doubles(lats[644], -0.632565, tolerance);
    compare_doubles(lats[645], -0.773135, tolerance);
    compare_doubles(lats[646], -0.913706, tolerance);
    compare_doubles(lats[647], -1.054276, tolerance);
    compare_doubles(lats[648], -1.194846, tolerance);
    compare_doubles(lats[649], -1.335416, tolerance);
    compare_doubles(lats[650], -1.475986, tolerance);
    compare_doubles(lats[651], -1.616556, tolerance);
    compare_doubles(lats[652], -1.757126, tolerance);
    compare_doubles(lats[653], -1.897696, tolerance);
    compare_doubles(lats[654], -2.038266, tolerance);
    compare_doubles(lats[655], -2.178836, tolerance);
    compare_doubles(lats[656], -2.319406, tolerance);
    compare_doubles(lats[657], -2.459976, tolerance);
    compare_doubles(lats[658], -2.600546, tolerance);
    compare_doubles(lats[659], -2.741117, tolerance);
    compare_doubles(lats[660], -2.881687, tolerance);
    compare_doubles(lats[661], -3.022257, tolerance);
    compare_doubles(lats[662], -3.162827, tolerance);
    compare_doubles(lats[663], -3.303397, tolerance);
    compare_doubles(lats[664], -3.443967, tolerance);
    compare_doubles(lats[665], -3.584537, tolerance);
    compare_doubles(lats[666], -3.725107, tolerance);
    compare_doubles(lats[667], -3.865677, tolerance);
    compare_doubles(lats[668], -4.006247, tolerance);
    compare_doubles(lats[669], -4.146817, tolerance);
    compare_doubles(lats[670], -4.287387, tolerance);
    compare_doubles(lats[671], -4.427957, tolerance);
    compare_doubles(lats[672], -4.568528, tolerance);
    compare_doubles(lats[673], -4.709098, tolerance);
    compare_doubles(lats[674], -4.849668, tolerance);
    compare_doubles(lats[675], -4.990238, tolerance);
    compare_doubles(lats[676], -5.130808, tolerance);
    compare_doubles(lats[677], -5.271378, tolerance);
    compare_doubles(lats[678], -5.411948, tolerance);
    compare_doubles(lats[679], -5.552518, tolerance);
    compare_doubles(lats[680], -5.693088, tolerance);
    compare_doubles(lats[681], -5.833658, tolerance);
    compare_doubles(lats[682], -5.974228, tolerance);
    compare_doubles(lats[683], -6.114798, tolerance);
    compare_doubles(lats[684], -6.255369, tolerance);
    compare_doubles(lats[685], -6.395939, tolerance);
    compare_doubles(lats[686], -6.536509, tolerance);
    compare_doubles(lats[687], -6.677079, tolerance);
    compare_doubles(lats[688], -6.817649, tolerance);
    compare_doubles(lats[689], -6.958219, tolerance);
    compare_doubles(lats[690], -7.098789, tolerance);
    compare_doubles(lats[691], -7.239359, tolerance);
    compare_doubles(lats[692], -7.379929, tolerance);
    compare_doubles(lats[693], -7.520499, tolerance);
    compare_doubles(lats[694], -7.661069, tolerance);
    compare_doubles(lats[695], -7.801639, tolerance);
    compare_doubles(lats[696], -7.942209, tolerance);
    compare_doubles(lats[697], -8.082780, tolerance);
    compare_doubles(lats[698], -8.223350, tolerance);
    compare_doubles(lats[699], -8.363920, tolerance);
    compare_doubles(lats[700], -8.504490, tolerance);
    compare_doubles(lats[701], -8.645060, tolerance);
    compare_doubles(lats[702], -8.785630, tolerance);
    compare_doubles(lats[703], -8.926200, tolerance);
    compare_doubles(lats[704], -9.066770, tolerance);
    compare_doubles(lats[705], -9.207340, tolerance);
    compare_doubles(lats[706], -9.347910, tolerance);
    compare_doubles(lats[707], -9.488480, tolerance);
    compare_doubles(lats[708], -9.629050, tolerance);
    compare_doubles(lats[709], -9.769620, tolerance);
    compare_doubles(lats[710], -9.910191, tolerance);
    compare_doubles(lats[711], -10.050761, tolerance);
    compare_doubles(lats[712], -10.191331, tolerance);
    compare_doubles(lats[713], -10.331901, tolerance);
    compare_doubles(lats[714], -10.472471, tolerance);
    compare_doubles(lats[715], -10.613041, tolerance);
    compare_doubles(lats[716], -10.753611, tolerance);
    compare_doubles(lats[717], -10.894181, tolerance);
    compare_doubles(lats[718], -11.034751, tolerance);
    compare_doubles(lats[719], -11.175321, tolerance);
    compare_doubles(lats[720], -11.315891, tolerance);
    compare_doubles(lats[721], -11.456461, tolerance);
    compare_doubles(lats[722], -11.597032, tolerance);
    compare_doubles(lats[723], -11.737602, tolerance);
    compare_doubles(lats[724], -11.878172, tolerance);
    compare_doubles(lats[725], -12.018742, tolerance);
    compare_doubles(lats[726], -12.159312, tolerance);
    compare_doubles(lats[727], -12.299882, tolerance);
    compare_doubles(lats[728], -12.440452, tolerance);
    compare_doubles(lats[729], -12.581022, tolerance);
    compare_doubles(lats[730], -12.721592, tolerance);
    compare_doubles(lats[731], -12.862162, tolerance);
    compare_doubles(lats[732], -13.002732, tolerance);
    compare_doubles(lats[733], -13.143302, tolerance);
    compare_doubles(lats[734], -13.283872, tolerance);
    compare_doubles(lats[735], -13.424443, tolerance);
    compare_doubles(lats[736], -13.565013, tolerance);
    compare_doubles(lats[737], -13.705583, tolerance);
    compare_doubles(lats[738], -13.846153, tolerance);
    compare_doubles(lats[739], -13.986723, tolerance);
    compare_doubles(lats[740], -14.127293, tolerance);
    compare_doubles(lats[741], -14.267863, tolerance);
    compare_doubles(lats[742], -14.408433, tolerance);
    compare_doubles(lats[743], -14.549003, tolerance);
    compare_doubles(lats[744], -14.689573, tolerance);
    compare_doubles(lats[745], -14.830143, tolerance);
    compare_doubles(lats[746], -14.970713, tolerance);
    compare_doubles(lats[747], -15.111283, tolerance);
    compare_doubles(lats[748], -15.251854, tolerance);
    compare_doubles(lats[749], -15.392424, tolerance);
    compare_doubles(lats[750], -15.532994, tolerance);
    compare_doubles(lats[751], -15.673564, tolerance);
    compare_doubles(lats[752], -15.814134, tolerance);
    compare_doubles(lats[753], -15.954704, tolerance);
    compare_doubles(lats[754], -16.095274, tolerance);
    compare_doubles(lats[755], -16.235844, tolerance);
    compare_doubles(lats[756], -16.376414, tolerance);
    compare_doubles(lats[757], -16.516984, tolerance);
    compare_doubles(lats[758], -16.657554, tolerance);
    compare_doubles(lats[759], -16.798124, tolerance);
    compare_doubles(lats[760], -16.938694, tolerance);
    compare_doubles(lats[761], -17.079265, tolerance);
    compare_doubles(lats[762], -17.219835, tolerance);
    compare_doubles(lats[763], -17.360405, tolerance);
    compare_doubles(lats[764], -17.500975, tolerance);
    compare_doubles(lats[765], -17.641545, tolerance);
    compare_doubles(lats[766], -17.782115, tolerance);
    compare_doubles(lats[767], -17.922685, tolerance);
    compare_doubles(lats[768], -18.063255, tolerance);
    compare_doubles(lats[769], -18.203825, tolerance);
    compare_doubles(lats[770], -18.344395, tolerance);
    compare_doubles(lats[771], -18.484965, tolerance);
    compare_doubles(lats[772], -18.625535, tolerance);
    compare_doubles(lats[773], -18.766106, tolerance);
    compare_doubles(lats[774], -18.906676, tolerance);
    compare_doubles(lats[775], -19.047246, tolerance);
    compare_doubles(lats[776], -19.187816, tolerance);
    compare_doubles(lats[777], -19.328386, tolerance);
    compare_doubles(lats[778], -19.468956, tolerance);
    compare_doubles(lats[779], -19.609526, tolerance);
    compare_doubles(lats[780], -19.750096, tolerance);
    compare_doubles(lats[781], -19.890666, tolerance);
    compare_doubles(lats[782], -20.031236, tolerance);
    compare_doubles(lats[783], -20.171806, tolerance);
    compare_doubles(lats[784], -20.312376, tolerance);
    compare_doubles(lats[785], -20.452946, tolerance);
    compare_doubles(lats[786], -20.593517, tolerance);
    compare_doubles(lats[787], -20.734087, tolerance);
    compare_doubles(lats[788], -20.874657, tolerance);
    compare_doubles(lats[789], -21.015227, tolerance);
    compare_doubles(lats[790], -21.155797, tolerance);
    compare_doubles(lats[791], -21.296367, tolerance);
    compare_doubles(lats[792], -21.436937, tolerance);
    compare_doubles(lats[793], -21.577507, tolerance);
    compare_doubles(lats[794], -21.718077, tolerance);
    compare_doubles(lats[795], -21.858647, tolerance);
    compare_doubles(lats[796], -21.999217, tolerance);
    compare_doubles(lats[797], -22.139787, tolerance);
    compare_doubles(lats[798], -22.280357, tolerance);
    compare_doubles(lats[799], -22.420928, tolerance);
    compare_doubles(lats[800], -22.561498, tolerance);
    compare_doubles(lats[801], -22.702068, tolerance);
    compare_doubles(lats[802], -22.842638, tolerance);
    compare_doubles(lats[803], -22.983208, tolerance);
    compare_doubles(lats[804], -23.123778, tolerance);
    compare_doubles(lats[805], -23.264348, tolerance);
    compare_doubles(lats[806], -23.404918, tolerance);
    compare_doubles(lats[807], -23.545488, tolerance);
    compare_doubles(lats[808], -23.686058, tolerance);
    compare_doubles(lats[809], -23.826628, tolerance);
    compare_doubles(lats[810], -23.967198, tolerance);
    compare_doubles(lats[811], -24.107768, tolerance);
    compare_doubles(lats[812], -24.248339, tolerance);
    compare_doubles(lats[813], -24.388909, tolerance);
    compare_doubles(lats[814], -24.529479, tolerance);
    compare_doubles(lats[815], -24.670049, tolerance);
    compare_doubles(lats[816], -24.810619, tolerance);
    compare_doubles(lats[817], -24.951189, tolerance);
    compare_doubles(lats[818], -25.091759, tolerance);
    compare_doubles(lats[819], -25.232329, tolerance);
    compare_doubles(lats[820], -25.372899, tolerance);
    compare_doubles(lats[821], -25.513469, tolerance);
    compare_doubles(lats[822], -25.654039, tolerance);
    compare_doubles(lats[823], -25.794609, tolerance);
    compare_doubles(lats[824], -25.935179, tolerance);
    compare_doubles(lats[825], -26.075750, tolerance);
    compare_doubles(lats[826], -26.216320, tolerance);
    compare_doubles(lats[827], -26.356890, tolerance);
    compare_doubles(lats[828], -26.497460, tolerance);
    compare_doubles(lats[829], -26.638030, tolerance);
    compare_doubles(lats[830], -26.778600, tolerance);
    compare_doubles(lats[831], -26.919170, tolerance);
    compare_doubles(lats[832], -27.059740, tolerance);
    compare_doubles(lats[833], -27.200310, tolerance);
    compare_doubles(lats[834], -27.340880, tolerance);
    compare_doubles(lats[835], -27.481450, tolerance);
    compare_doubles(lats[836], -27.622020, tolerance);
    compare_doubles(lats[837], -27.762590, tolerance);
    compare_doubles(lats[838], -27.903161, tolerance);
    compare_doubles(lats[839], -28.043731, tolerance);
    compare_doubles(lats[840], -28.184301, tolerance);
    compare_doubles(lats[841], -28.324871, tolerance);
    compare_doubles(lats[842], -28.465441, tolerance);
    compare_doubles(lats[843], -28.606011, tolerance);
    compare_doubles(lats[844], -28.746581, tolerance);
    compare_doubles(lats[845], -28.887151, tolerance);
    compare_doubles(lats[846], -29.027721, tolerance);
    compare_doubles(lats[847], -29.168291, tolerance);
    compare_doubles(lats[848], -29.308861, tolerance);
    compare_doubles(lats[849], -29.449431, tolerance);
    compare_doubles(lats[850], -29.590001, tolerance);
    compare_doubles(lats[851], -29.730572, tolerance);
    compare_doubles(lats[852], -29.871142, tolerance);
    compare_doubles(lats[853], -30.011712, tolerance);
    compare_doubles(lats[854], -30.152282, tolerance);
    compare_doubles(lats[855], -30.292852, tolerance);
    compare_doubles(lats[856], -30.433422, tolerance);
    compare_doubles(lats[857], -30.573992, tolerance);
    compare_doubles(lats[858], -30.714562, tolerance);
    compare_doubles(lats[859], -30.855132, tolerance);
    compare_doubles(lats[860], -30.995702, tolerance);
    compare_doubles(lats[861], -31.136272, tolerance);
    compare_doubles(lats[862], -31.276842, tolerance);
    compare_doubles(lats[863], -31.417412, tolerance);
    compare_doubles(lats[864], -31.557982, tolerance);
    compare_doubles(lats[865], -31.698553, tolerance);
    compare_doubles(lats[866], -31.839123, tolerance);
    compare_doubles(lats[867], -31.979693, tolerance);
    compare_doubles(lats[868], -32.120263, tolerance);
    compare_doubles(lats[869], -32.260833, tolerance);
    compare_doubles(lats[870], -32.401403, tolerance);
    compare_doubles(lats[871], -32.541973, tolerance);
    compare_doubles(lats[872], -32.682543, tolerance);
    compare_doubles(lats[873], -32.823113, tolerance);
    compare_doubles(lats[874], -32.963683, tolerance);
    compare_doubles(lats[875], -33.104253, tolerance);
    compare_doubles(lats[876], -33.244823, tolerance);
    compare_doubles(lats[877], -33.385393, tolerance);
    compare_doubles(lats[878], -33.525964, tolerance);
    compare_doubles(lats[879], -33.666534, tolerance);
    compare_doubles(lats[880], -33.807104, tolerance);
    compare_doubles(lats[881], -33.947674, tolerance);
    compare_doubles(lats[882], -34.088244, tolerance);
    compare_doubles(lats[883], -34.228814, tolerance);
    compare_doubles(lats[884], -34.369384, tolerance);
    compare_doubles(lats[885], -34.509954, tolerance);
    compare_doubles(lats[886], -34.650524, tolerance);
    compare_doubles(lats[887], -34.791094, tolerance);
    compare_doubles(lats[888], -34.931664, tolerance);
    compare_doubles(lats[889], -35.072234, tolerance);
    compare_doubles(lats[890], -35.212804, tolerance);
    compare_doubles(lats[891], -35.353374, tolerance);
    compare_doubles(lats[892], -35.493945, tolerance);
    compare_doubles(lats[893], -35.634515, tolerance);
    compare_doubles(lats[894], -35.775085, tolerance);
    compare_doubles(lats[895], -35.915655, tolerance);
    compare_doubles(lats[896], -36.056225, tolerance);
    compare_doubles(lats[897], -36.196795, tolerance);
    compare_doubles(lats[898], -36.337365, tolerance);
    compare_doubles(lats[899], -36.477935, tolerance);
    compare_doubles(lats[900], -36.618505, tolerance);
    compare_doubles(lats[901], -36.759075, tolerance);
    compare_doubles(lats[902], -36.899645, tolerance);
    compare_doubles(lats[903], -37.040215, tolerance);
    compare_doubles(lats[904], -37.180785, tolerance);
    compare_doubles(lats[905], -37.321356, tolerance);
    compare_doubles(lats[906], -37.461926, tolerance);
    compare_doubles(lats[907], -37.602496, tolerance);
    compare_doubles(lats[908], -37.743066, tolerance);
    compare_doubles(lats[909], -37.883636, tolerance);
    compare_doubles(lats[910], -38.024206, tolerance);
    compare_doubles(lats[911], -38.164776, tolerance);
    compare_doubles(lats[912], -38.305346, tolerance);
    compare_doubles(lats[913], -38.445916, tolerance);
    compare_doubles(lats[914], -38.586486, tolerance);
    compare_doubles(lats[915], -38.727056, tolerance);
    compare_doubles(lats[916], -38.867626, tolerance);
    compare_doubles(lats[917], -39.008196, tolerance);
    compare_doubles(lats[918], -39.148766, tolerance);
    compare_doubles(lats[919], -39.289337, tolerance);
    compare_doubles(lats[920], -39.429907, tolerance);
    compare_doubles(lats[921], -39.570477, tolerance);
    compare_doubles(lats[922], -39.711047, tolerance);
    compare_doubles(lats[923], -39.851617, tolerance);
    compare_doubles(lats[924], -39.992187, tolerance);
    compare_doubles(lats[925], -40.132757, tolerance);
    compare_doubles(lats[926], -40.273327, tolerance);
    compare_doubles(lats[927], -40.413897, tolerance);
    compare_doubles(lats[928], -40.554467, tolerance);
    compare_doubles(lats[929], -40.695037, tolerance);
    compare_doubles(lats[930], -40.835607, tolerance);
    compare_doubles(lats[931], -40.976177, tolerance);
    compare_doubles(lats[932], -41.116747, tolerance);
    compare_doubles(lats[933], -41.257318, tolerance);
    compare_doubles(lats[934], -41.397888, tolerance);
    compare_doubles(lats[935], -41.538458, tolerance);
    compare_doubles(lats[936], -41.679028, tolerance);
    compare_doubles(lats[937], -41.819598, tolerance);
    compare_doubles(lats[938], -41.960168, tolerance);
    compare_doubles(lats[939], -42.100738, tolerance);
    compare_doubles(lats[940], -42.241308, tolerance);
    compare_doubles(lats[941], -42.381878, tolerance);
    compare_doubles(lats[942], -42.522448, tolerance);
    compare_doubles(lats[943], -42.663018, tolerance);
    compare_doubles(lats[944], -42.803588, tolerance);
    compare_doubles(lats[945], -42.944158, tolerance);
    compare_doubles(lats[946], -43.084728, tolerance);
    compare_doubles(lats[947], -43.225299, tolerance);
    compare_doubles(lats[948], -43.365869, tolerance);
    compare_doubles(lats[949], -43.506439, tolerance);
    compare_doubles(lats[950], -43.647009, tolerance);
    compare_doubles(lats[951], -43.787579, tolerance);
    compare_doubles(lats[952], -43.928149, tolerance);
    compare_doubles(lats[953], -44.068719, tolerance);
    compare_doubles(lats[954], -44.209289, tolerance);
    compare_doubles(lats[955], -44.349859, tolerance);
    compare_doubles(lats[956], -44.490429, tolerance);
    compare_doubles(lats[957], -44.630999, tolerance);
    compare_doubles(lats[958], -44.771569, tolerance);
    compare_doubles(lats[959], -44.912139, tolerance);
    compare_doubles(lats[960], -45.052709, tolerance);
    compare_doubles(lats[961], -45.193279, tolerance);
    compare_doubles(lats[962], -45.333850, tolerance);
    compare_doubles(lats[963], -45.474420, tolerance);
    compare_doubles(lats[964], -45.614990, tolerance);
    compare_doubles(lats[965], -45.755560, tolerance);
    compare_doubles(lats[966], -45.896130, tolerance);
    compare_doubles(lats[967], -46.036700, tolerance);
    compare_doubles(lats[968], -46.177270, tolerance);
    compare_doubles(lats[969], -46.317840, tolerance);
    compare_doubles(lats[970], -46.458410, tolerance);
    compare_doubles(lats[971], -46.598980, tolerance);
    compare_doubles(lats[972], -46.739550, tolerance);
    compare_doubles(lats[973], -46.880120, tolerance);
    compare_doubles(lats[974], -47.020690, tolerance);
    compare_doubles(lats[975], -47.161260, tolerance);
    compare_doubles(lats[976], -47.301830, tolerance);
    compare_doubles(lats[977], -47.442401, tolerance);
    compare_doubles(lats[978], -47.582971, tolerance);
    compare_doubles(lats[979], -47.723541, tolerance);
    compare_doubles(lats[980], -47.864111, tolerance);
    compare_doubles(lats[981], -48.004681, tolerance);
    compare_doubles(lats[982], -48.145251, tolerance);
    compare_doubles(lats[983], -48.285821, tolerance);
    compare_doubles(lats[984], -48.426391, tolerance);
    compare_doubles(lats[985], -48.566961, tolerance);
    compare_doubles(lats[986], -48.707531, tolerance);
    compare_doubles(lats[987], -48.848101, tolerance);
    compare_doubles(lats[988], -48.988671, tolerance);
    compare_doubles(lats[989], -49.129241, tolerance);
    compare_doubles(lats[990], -49.269811, tolerance);
    compare_doubles(lats[991], -49.410381, tolerance);
    compare_doubles(lats[992], -49.550952, tolerance);
    compare_doubles(lats[993], -49.691522, tolerance);
    compare_doubles(lats[994], -49.832092, tolerance);
    compare_doubles(lats[995], -49.972662, tolerance);
    compare_doubles(lats[996], -50.113232, tolerance);
    compare_doubles(lats[997], -50.253802, tolerance);
    compare_doubles(lats[998], -50.394372, tolerance);
    compare_doubles(lats[999], -50.534942, tolerance);
    compare_doubles(lats[1000], -50.675512, tolerance);
    compare_doubles(lats[1001], -50.816082, tolerance);
    compare_doubles(lats[1002], -50.956652, tolerance);
    compare_doubles(lats[1003], -51.097222, tolerance);
    compare_doubles(lats[1004], -51.237792, tolerance);
    compare_doubles(lats[1005], -51.378362, tolerance);
    compare_doubles(lats[1006], -51.518932, tolerance);
    compare_doubles(lats[1007], -51.659502, tolerance);
    compare_doubles(lats[1008], -51.800073, tolerance);
    compare_doubles(lats[1009], -51.940643, tolerance);
    compare_doubles(lats[1010], -52.081213, tolerance);
    compare_doubles(lats[1011], -52.221783, tolerance);
    compare_doubles(lats[1012], -52.362353, tolerance);
    compare_doubles(lats[1013], -52.502923, tolerance);
    compare_doubles(lats[1014], -52.643493, tolerance);
    compare_doubles(lats[1015], -52.784063, tolerance);
    compare_doubles(lats[1016], -52.924633, tolerance);
    compare_doubles(lats[1017], -53.065203, tolerance);
    compare_doubles(lats[1018], -53.205773, tolerance);
    compare_doubles(lats[1019], -53.346343, tolerance);
    compare_doubles(lats[1020], -53.486913, tolerance);
    compare_doubles(lats[1021], -53.627483, tolerance);
    compare_doubles(lats[1022], -53.768053, tolerance);
    compare_doubles(lats[1023], -53.908623, tolerance);
    compare_doubles(lats[1024], -54.049194, tolerance);
    compare_doubles(lats[1025], -54.189764, tolerance);
    compare_doubles(lats[1026], -54.330334, tolerance);
    compare_doubles(lats[1027], -54.470904, tolerance);
    compare_doubles(lats[1028], -54.611474, tolerance);
    compare_doubles(lats[1029], -54.752044, tolerance);
    compare_doubles(lats[1030], -54.892614, tolerance);
    compare_doubles(lats[1031], -55.033184, tolerance);
    compare_doubles(lats[1032], -55.173754, tolerance);
    compare_doubles(lats[1033], -55.314324, tolerance);
    compare_doubles(lats[1034], -55.454894, tolerance);
    compare_doubles(lats[1035], -55.595464, tolerance);
    compare_doubles(lats[1036], -55.736034, tolerance);
    compare_doubles(lats[1037], -55.876604, tolerance);
    compare_doubles(lats[1038], -56.017174, tolerance);
    compare_doubles(lats[1039], -56.157744, tolerance);
    compare_doubles(lats[1040], -56.298314, tolerance);
    compare_doubles(lats[1041], -56.438884, tolerance);
    compare_doubles(lats[1042], -56.579455, tolerance);
    compare_doubles(lats[1043], -56.720025, tolerance);
    compare_doubles(lats[1044], -56.860595, tolerance);
    compare_doubles(lats[1045], -57.001165, tolerance);
    compare_doubles(lats[1046], -57.141735, tolerance);
    compare_doubles(lats[1047], -57.282305, tolerance);
    compare_doubles(lats[1048], -57.422875, tolerance);
    compare_doubles(lats[1049], -57.563445, tolerance);
    compare_doubles(lats[1050], -57.704015, tolerance);
    compare_doubles(lats[1051], -57.844585, tolerance);
    compare_doubles(lats[1052], -57.985155, tolerance);
    compare_doubles(lats[1053], -58.125725, tolerance);
    compare_doubles(lats[1054], -58.266295, tolerance);
    compare_doubles(lats[1055], -58.406865, tolerance);
    compare_doubles(lats[1056], -58.547435, tolerance);
    compare_doubles(lats[1057], -58.688005, tolerance);
    compare_doubles(lats[1058], -58.828575, tolerance);
    compare_doubles(lats[1059], -58.969145, tolerance);
    compare_doubles(lats[1060], -59.109715, tolerance);
    compare_doubles(lats[1061], -59.250286, tolerance);
    compare_doubles(lats[1062], -59.390856, tolerance);
    compare_doubles(lats[1063], -59.531426, tolerance);
    compare_doubles(lats[1064], -59.671996, tolerance);
    compare_doubles(lats[1065], -59.812566, tolerance);
    compare_doubles(lats[1066], -59.953136, tolerance);
    compare_doubles(lats[1067], -60.093706, tolerance);
    compare_doubles(lats[1068], -60.234276, tolerance);
    compare_doubles(lats[1069], -60.374846, tolerance);
    compare_doubles(lats[1070], -60.515416, tolerance);
    compare_doubles(lats[1071], -60.655986, tolerance);
    compare_doubles(lats[1072], -60.796556, tolerance);
    compare_doubles(lats[1073], -60.937126, tolerance);
    compare_doubles(lats[1074], -61.077696, tolerance);
    compare_doubles(lats[1075], -61.218266, tolerance);
    compare_doubles(lats[1076], -61.358836, tolerance);
    compare_doubles(lats[1077], -61.499406, tolerance);
    compare_doubles(lats[1078], -61.639976, tolerance);
    compare_doubles(lats[1079], -61.780546, tolerance);
    compare_doubles(lats[1080], -61.921116, tolerance);
    compare_doubles(lats[1081], -62.061686, tolerance);
    compare_doubles(lats[1082], -62.202256, tolerance);
    compare_doubles(lats[1083], -62.342826, tolerance);
    compare_doubles(lats[1084], -62.483397, tolerance);
    compare_doubles(lats[1085], -62.623967, tolerance);
    compare_doubles(lats[1086], -62.764537, tolerance);
    compare_doubles(lats[1087], -62.905107, tolerance);
    compare_doubles(lats[1088], -63.045677, tolerance);
    compare_doubles(lats[1089], -63.186247, tolerance);
    compare_doubles(lats[1090], -63.326817, tolerance);
    compare_doubles(lats[1091], -63.467387, tolerance);
    compare_doubles(lats[1092], -63.607957, tolerance);
    compare_doubles(lats[1093], -63.748527, tolerance);
    compare_doubles(lats[1094], -63.889097, tolerance);
    compare_doubles(lats[1095], -64.029667, tolerance);
    compare_doubles(lats[1096], -64.170237, tolerance);
    compare_doubles(lats[1097], -64.310807, tolerance);
    compare_doubles(lats[1098], -64.451377, tolerance);
    compare_doubles(lats[1099], -64.591947, tolerance);
    compare_doubles(lats[1100], -64.732517, tolerance);
    compare_doubles(lats[1101], -64.873087, tolerance);
    compare_doubles(lats[1102], -65.013657, tolerance);
    compare_doubles(lats[1103], -65.154227, tolerance);
    compare_doubles(lats[1104], -65.294797, tolerance);
    compare_doubles(lats[1105], -65.435367, tolerance);
    compare_doubles(lats[1106], -65.575937, tolerance);
    compare_doubles(lats[1107], -65.716507, tolerance);
    compare_doubles(lats[1108], -65.857077, tolerance);
    compare_doubles(lats[1109], -65.997647, tolerance);
    compare_doubles(lats[1110], -66.138217, tolerance);
    compare_doubles(lats[1111], -66.278787, tolerance);
    compare_doubles(lats[1112], -66.419357, tolerance);
    compare_doubles(lats[1113], -66.559927, tolerance);
    compare_doubles(lats[1114], -66.700497, tolerance);
    compare_doubles(lats[1115], -66.841067, tolerance);
    compare_doubles(lats[1116], -66.981638, tolerance);
    compare_doubles(lats[1117], -67.122208, tolerance);
    compare_doubles(lats[1118], -67.262778, tolerance);
    compare_doubles(lats[1119], -67.403348, tolerance);
    compare_doubles(lats[1120], -67.543918, tolerance);
    compare_doubles(lats[1121], -67.684488, tolerance);
    compare_doubles(lats[1122], -67.825058, tolerance);
    compare_doubles(lats[1123], -67.965628, tolerance);
    compare_doubles(lats[1124], -68.106198, tolerance);
    compare_doubles(lats[1125], -68.246768, tolerance);
    compare_doubles(lats[1126], -68.387338, tolerance);
    compare_doubles(lats[1127], -68.527908, tolerance);
    compare_doubles(lats[1128], -68.668478, tolerance);
    compare_doubles(lats[1129], -68.809048, tolerance);
    compare_doubles(lats[1130], -68.949618, tolerance);
    compare_doubles(lats[1131], -69.090188, tolerance);
    compare_doubles(lats[1132], -69.230758, tolerance);
    compare_doubles(lats[1133], -69.371328, tolerance);
    compare_doubles(lats[1134], -69.511898, tolerance);
    compare_doubles(lats[1135], -69.652468, tolerance);
    compare_doubles(lats[1136], -69.793038, tolerance);
    compare_doubles(lats[1137], -69.933608, tolerance);
    compare_doubles(lats[1138], -70.074178, tolerance);
    compare_doubles(lats[1139], -70.214748, tolerance);
    compare_doubles(lats[1140], -70.355318, tolerance);
    compare_doubles(lats[1141], -70.495888, tolerance);
    compare_doubles(lats[1142], -70.636458, tolerance);
    compare_doubles(lats[1143], -70.777028, tolerance);
    compare_doubles(lats[1144], -70.917598, tolerance);
    compare_doubles(lats[1145], -71.058168, tolerance);
    compare_doubles(lats[1146], -71.198738, tolerance);
    compare_doubles(lats[1147], -71.339308, tolerance);
    compare_doubles(lats[1148], -71.479878, tolerance);
    compare_doubles(lats[1149], -71.620448, tolerance);
    compare_doubles(lats[1150], -71.761018, tolerance);
    compare_doubles(lats[1151], -71.901588, tolerance);
    compare_doubles(lats[1152], -72.042158, tolerance);
    compare_doubles(lats[1153], -72.182728, tolerance);
    compare_doubles(lats[1154], -72.323298, tolerance);
    compare_doubles(lats[1155], -72.463867, tolerance);
    compare_doubles(lats[1156], -72.604437, tolerance);
    compare_doubles(lats[1157], -72.745007, tolerance);
    compare_doubles(lats[1158], -72.885577, tolerance);
    compare_doubles(lats[1159], -73.026147, tolerance);
    compare_doubles(lats[1160], -73.166717, tolerance);
    compare_doubles(lats[1161], -73.307287, tolerance);
    compare_doubles(lats[1162], -73.447857, tolerance);
    compare_doubles(lats[1163], -73.588427, tolerance);
    compare_doubles(lats[1164], -73.728997, tolerance);
    compare_doubles(lats[1165], -73.869567, tolerance);
    compare_doubles(lats[1166], -74.010137, tolerance);
    compare_doubles(lats[1167], -74.150707, tolerance);
    compare_doubles(lats[1168], -74.291277, tolerance);
    compare_doubles(lats[1169], -74.431847, tolerance);
    compare_doubles(lats[1170], -74.572417, tolerance);
    compare_doubles(lats[1171], -74.712987, tolerance);
    compare_doubles(lats[1172], -74.853557, tolerance);
    compare_doubles(lats[1173], -74.994127, tolerance);
    compare_doubles(lats[1174], -75.134697, tolerance);
    compare_doubles(lats[1175], -75.275266, tolerance);
    compare_doubles(lats[1176], -75.415836, tolerance);
    compare_doubles(lats[1177], -75.556406, tolerance);
    compare_doubles(lats[1178], -75.696976, tolerance);
    compare_doubles(lats[1179], -75.837546, tolerance);
    compare_doubles(lats[1180], -75.978116, tolerance);
    compare_doubles(lats[1181], -76.118686, tolerance);
    compare_doubles(lats[1182], -76.259256, tolerance);
    compare_doubles(lats[1183], -76.399826, tolerance);
    compare_doubles(lats[1184], -76.540396, tolerance);
    compare_doubles(lats[1185], -76.680966, tolerance);
    compare_doubles(lats[1186], -76.821535, tolerance);
    compare_doubles(lats[1187], -76.962105, tolerance);
    compare_doubles(lats[1188], -77.102675, tolerance);
    compare_doubles(lats[1189], -77.243245, tolerance);
    compare_doubles(lats[1190], -77.383815, tolerance);
    compare_doubles(lats[1191], -77.524385, tolerance);
    compare_doubles(lats[1192], -77.664955, tolerance);
    compare_doubles(lats[1193], -77.805524, tolerance);
    compare_doubles(lats[1194], -77.946094, tolerance);
    compare_doubles(lats[1195], -78.086664, tolerance);
    compare_doubles(lats[1196], -78.227234, tolerance);
    compare_doubles(lats[1197], -78.367804, tolerance);
    compare_doubles(lats[1198], -78.508374, tolerance);
    compare_doubles(lats[1199], -78.648943, tolerance);
    compare_doubles(lats[1200], -78.789513, tolerance);
    compare_doubles(lats[1201], -78.930083, tolerance);
    compare_doubles(lats[1202], -79.070653, tolerance);
    compare_doubles(lats[1203], -79.211223, tolerance);
    compare_doubles(lats[1204], -79.351792, tolerance);
    compare_doubles(lats[1205], -79.492362, tolerance);
    compare_doubles(lats[1206], -79.632932, tolerance);
    compare_doubles(lats[1207], -79.773502, tolerance);
    compare_doubles(lats[1208], -79.914072, tolerance);
    compare_doubles(lats[1209], -80.054641, tolerance);
    compare_doubles(lats[1210], -80.195211, tolerance);
    compare_doubles(lats[1211], -80.335781, tolerance);
    compare_doubles(lats[1212], -80.476350, tolerance);
    compare_doubles(lats[1213], -80.616920, tolerance);
    compare_doubles(lats[1214], -80.757490, tolerance);
    compare_doubles(lats[1215], -80.898059, tolerance);
    compare_doubles(lats[1216], -81.038629, tolerance);
    compare_doubles(lats[1217], -81.179199, tolerance);
    compare_doubles(lats[1218], -81.319768, tolerance);
    compare_doubles(lats[1219], -81.460338, tolerance);
    compare_doubles(lats[1220], -81.600908, tolerance);
    compare_doubles(lats[1221], -81.741477, tolerance);
    compare_doubles(lats[1222], -81.882047, tolerance);
    compare_doubles(lats[1223], -82.022616, tolerance);
    compare_doubles(lats[1224], -82.163186, tolerance);
    compare_doubles(lats[1225], -82.303755, tolerance);
    compare_doubles(lats[1226], -82.444325, tolerance);
    compare_doubles(lats[1227], -82.584894, tolerance);
    compare_doubles(lats[1228], -82.725464, tolerance);
    compare_doubles(lats[1229], -82.866033, tolerance);
    compare_doubles(lats[1230], -83.006602, tolerance);
    compare_doubles(lats[1231], -83.147172, tolerance);
    compare_doubles(lats[1232], -83.287741, tolerance);
    compare_doubles(lats[1233], -83.428310, tolerance);
    compare_doubles(lats[1234], -83.568880, tolerance);
    compare_doubles(lats[1235], -83.709449, tolerance);
    compare_doubles(lats[1236], -83.850018, tolerance);
    compare_doubles(lats[1237], -83.990587, tolerance);
    compare_doubles(lats[1238], -84.131156, tolerance);
    compare_doubles(lats[1239], -84.271725, tolerance);
    compare_doubles(lats[1240], -84.412294, tolerance);
    compare_doubles(lats[1241], -84.552863, tolerance);
    compare_doubles(lats[1242], -84.693432, tolerance);
    compare_doubles(lats[1243], -84.834001, tolerance);
    compare_doubles(lats[1244], -84.974570, tolerance);
    compare_doubles(lats[1245], -85.115138, tolerance);
    compare_doubles(lats[1246], -85.255707, tolerance);
    compare_doubles(lats[1247], -85.396275, tolerance);
    compare_doubles(lats[1248], -85.536844, tolerance);
    compare_doubles(lats[1249], -85.677412, tolerance);
    compare_doubles(lats[1250], -85.817980, tolerance);
    compare_doubles(lats[1251], -85.958548, tolerance);
    compare_doubles(lats[1252], -86.099116, tolerance);
    compare_doubles(lats[1253], -86.239684, tolerance);
    compare_doubles(lats[1254], -86.380251, tolerance);
    compare_doubles(lats[1255], -86.520818, tolerance);
    compare_doubles(lats[1256], -86.661385, tolerance);
    compare_doubles(lats[1257], -86.801952, tolerance);
    compare_doubles(lats[1258], -86.942519, tolerance);
    compare_doubles(lats[1259], -87.083085, tolerance);
    compare_doubles(lats[1260], -87.223651, tolerance);
    compare_doubles(lats[1261], -87.364216, tolerance);
    compare_doubles(lats[1262], -87.504781, tolerance);
    compare_doubles(lats[1263], -87.645345, tolerance);
    compare_doubles(lats[1264], -87.785908, tolerance);
    compare_doubles(lats[1265], -87.926471, tolerance);
    compare_doubles(lats[1266], -88.067032, tolerance);
    compare_doubles(lats[1267], -88.207592, tolerance);
    compare_doubles(lats[1268], -88.348150, tolerance);
    compare_doubles(lats[1269], -88.488706, tolerance);
    compare_doubles(lats[1270], -88.629259, tolerance);
    compare_doubles(lats[1271], -88.769808, tolerance);
    compare_doubles(lats[1272], -88.910352, tolerance);
    compare_doubles(lats[1273], -89.050889, tolerance);
    compare_doubles(lats[1274], -89.191413, tolerance);
    compare_doubles(lats[1275], -89.331918, tolerance);
    compare_doubles(lats[1276], -89.472390, tolerance);
    compare_doubles(lats[1277], -89.612790, tolerance);
    compare_doubles(lats[1278], -89.753005, tolerance);
    compare_doubles(lats[1279], -89.892396, tolerance);

    free(lats);
}

static void test_string_splitting()
{
    int i          = 0;
    char input[80] = "Born|To|Be|Wild";
    char** list    = 0;
    printf("Testing: test_string_splitting...\n");

    list           = string_split(input, "|");
    if (!list) { assert(!"List is NULL"); return; }
    for (i = 0; list[i] != NULL; ++i) {} /* count how many tokens */
    assert(i == 4);
    if (!list[0] || !STR_EQ(list[0], "Born")) Assert(0);
    if (!list[1] || !STR_EQ(list[1], "To"))   Assert(0);
    if (!list[2] || !STR_EQ(list[2], "Be"))   Assert(0);
    if (!list[3] || !STR_EQ(list[3], "Wild")) Assert(0);
    Assert(list[4] == NULL);
    for (i = 0; list[i] != NULL; ++i) free(list[i]);
    free(list);

    strcpy(input, "12345|a gap|");
    list = string_split(input, "|");
    if (!list) { assert(0); return; }
    for (i = 0; list[i] != NULL; ++i) {} /* count how many tokens */
    assert(i == 2);
    if (!list[0] || !STR_EQ(list[0], "12345")) Assert(0);
    if (!list[1] || !STR_EQ(list[1], "a gap")) Assert(0);
    assert(list[2] == NULL);
    for (i = 0; list[i] != NULL; ++i) free(list[i]);
    free(list);

    strcpy(input, "Steppenwolf");
    list = string_split(input, ",");
    if (!list) { assert(0); return; }
    for (i = 0; list[i] != NULL; ++i) {} /* count how many tokens */
    assert(i == 1);
    if (!list[0] || !STR_EQ(list[0], "Steppenwolf")) Assert(0);
    assert(list[1] == NULL);
    for (i = 0; list[i] != NULL; ++i) free(list[i]);
    free(list);

    /* Note: currently cannot cope with */
    /*  input being NULL */
    /*  input being empty */
    /*  input having several adjacent delimiters e.g. 'A||B|||C' */
}

static void my_assertion_proc(const char* message)
{
    printf("It's OK. I caught the assertion: %s\n", message);
    assertion_caught = 1;
}

static void test_assertion_catching()
{
    char empty[] = "";
    char** list  = 0;
    int i        = 0;
    assert(assertion_caught == 0);
    codes_set_codes_assertion_failed_proc(&my_assertion_proc);
    
    printf("Testing: test_assertion_catching...\n");

    /* Do something illegal */
    list = string_split(empty, " ");

    assert(assertion_caught == 1);

    /* Restore everything */
    codes_set_codes_assertion_failed_proc(NULL);
    assertion_caught = 0;

    for (i = 0; list[i] != NULL; ++i)
        free(list[i]);
    free(list);
}

static void test_concept_condition_strings()
{
    int err           = 0;
    char result[1024] = {0,};
    grib_handle* h = grib_handle_new_from_samples(0, "GRIB2");

    printf("Testing: test_concept_condition_strings...\n");

    err = get_concept_condition_string(h, "typeOfLevel", NULL, result);
    Assert(!err);
    Assert(strcmp(result, "typeOfFirstFixedSurface=1,typeOfSecondFixedSurface=255") == 0);

    err = get_concept_condition_string(h, "paramId", NULL, result);
    Assert(!err);
    Assert(strcmp(result, "discipline=0,parameterCategory=0,parameterNumber=0") == 0);

    err = get_concept_condition_string(h, "gridType", NULL, result);
    Assert(!err);
    Assert(strcmp(result, "gridDefinitionTemplateNumber=0,PLPresent=0") == 0);

    err = get_concept_condition_string(h, "stepType", NULL, result);
    Assert(!err);
    Assert(strcmp(result, "selectStepTemplateInstant=1,stepTypeInternal=instant") == 0);

    grib_handle_delete(h);
}

static void test_trimming()
{
    char a[] = " Standing  ";
    char b[] = "  Weeping ";
    char c[] = "  Silhouette ";
    char d[] = " The Forest Of October  ";
    char e[] = "\t\n Apostle In Triumph \r ";
    char* pA = a;
    char* pB = b;
    char* pC = c;
    char* pD = d;
    char* pE = e;

    lrtrim(&pA, 0, 1); /*right only*/
    assert( strcmp(pA, " Standing")==0 );

    lrtrim(&pB, 1, 0); /*left only*/
    assert( strcmp(pB, "Weeping ")==0 );

    lrtrim(&pC, 1, 1); /*both ends*/
    assert( strcmp(pC, "Silhouette")==0 );

    lrtrim(&pD, 1, 1); /*make sure other spaces are not removed*/
    assert( strcmp(pD, "The Forest Of October")==0 );

    lrtrim(&pE, 1, 1); /* Other chars */
    assert( strcmp(pE, "Apostle In Triumph")==0 );
}

int main(int argc, char** argv)
{
    /*printf("Doing unit tests. ecCodes version = %ld\n", grib_get_api_version());*/
    
    test_trimming();

    test_get_git_sha1();

    test_concept_condition_strings();

    test_assertion_catching();

    test_gaussian_latitude_640();

    test_gaussian_latitudes(32);
    test_gaussian_latitudes(48);
    test_gaussian_latitudes(80);
    test_gaussian_latitudes(128);
    test_gaussian_latitudes(160);
    test_gaussian_latitudes(200);
    test_gaussian_latitudes(256);
    test_gaussian_latitudes(320);
    test_gaussian_latitudes(400);
    test_gaussian_latitudes(512);
    test_gaussian_latitudes(640);
    test_gaussian_latitudes(1024);
    test_gaussian_latitudes(1280);
    test_gaussian_latitudes(2000);

    test_grib_nearest_smaller_ibmfloat();
    test_grib_nearest_smaller_ieeefloat();

    test_string_splitting();

    return 0;
}
